LUDI está implementado en tres capas: kernel, librería y juego del usuario. 1 Nivel de juego. Para hacer un juego LUDI, suponiendo que sea en un idioma ya soportado en LUDI. Ruta: /client/data/games/ Cada juego viene especificado en varios ficheros: 1.1 - about.json: Da información, sobre el propio juego: como el autor, título, y para cada idiomas en que está soportado, nombre del traductor y breve descripción del juego. 1.2 - game_world.json: En este fichero se declaran los items del juego (objetos, localidades y personajes). El autor también del juego puede reemplazar las caracterísitcas suministradas por la librería (atributos, acciones y direcciones), así como implementar las suyas propias. 1.3 - por cada idioma (XX) del juego: 1.3.1 - game_reactions.js: Programa en javascript que puede sobreescribir reacciones por defecto definidas a nivel de librería. 1.3.1 - gameMessagesXX.json: los mensajes estáticos del juego. Tienen la particularidad de que pueden ser traducibles directamente por el Google Translator Toolkit. 1.3.2 - gameMessagesByLanXX.json: información gramatical asociada a los items y acciones del juego, como el género y número, si procede. 1.3.3 - directorios audio e images: sonidos e imágenes específicos del juego en cuestión. 2 Nivel de librería. Define acciones(verbos) usables en todos los juegos, con sus reacciones por defecto. También predefine algunos tipos de atributos y direcciones (norte, sur,...) disponibles. Ruta: /client/data/lib La información de librería consiste en: 2.1- lib_world.json: declaración de acciones (verbos), atributos (características de objetos) y direcciones (conexiones desde localidades) que se suministran de manera estándar para el desarrollo de juegos. 2.2 - lib_reactions.js (en /client/lib): Programa en javascript con las reacciones por defecto definidas a nivel de librería. 2.3- Por cada idioma XX soportado por LUDI: 2.3.1 - libMessagesXX.json 2.3.2 - libMessagesByLanXX.json 3 Nivel de kernel. Define los mensajes de los menús para cada uno de los idiomas soportados. Ruta: /client/data/kernel Por cada idioma XX soportado: 3.1 kernelXX.json: los mensajes del núcleo del programa que permiten elegir un juego y cargarlo. 3.2 ludi_language.js (en /client/src): programación de asuntos dependientes del idioma, para la renderización de textos finales. --------------------------------------------------------------------------------- Nota: a partir de aquí la documentación no está actualizada: para hacerte una idea de cómo se programa con LUDI, mira los ficheros siguientes del juego tresfuentes: (ruta: \client\data\games\tresfuentes) game_world.json game_reactions.js gameMessagesES.json gameMessagesByLanES.json --------------------------------------------------------------------------------- Valores de los items (game_world.json): 1 - Items de personaje jugador (el item 0 debe ser el protagonista del juego; pero podrá haber más de uno, aunque sólo se puede controlar a uno a la vez) { "id": "harry", // identificador del item "type": "pc", // indica que es un Player Character (PJ en español) "loc": "loc_dunvojo", // inidica la localidad inicial "att": { // atributos definidos sobre este item "Soifo": {"state":"50"} , // valor inicial del atributo especificado "Malsato": {"state":"20"} // valor inicial del atributo especificado }, "state": { // valores específicos para un PC "turns": 0, // número de turnos jugados "score": 0, // puntuación "items": [] // "memoria" del personaje: contendrá qué sabe el personaje del mundo: objetos y localidades conocidos; inicialmente no conoce nada } }, 2- Items de localidades { "id": "loc_dunvojo", // identificador del item "type": "loc", // indica que es de tipo localidad // podría tener atributos, como el ejemplo anterior, pero en este caso no tiene "address": [ // conexiones a otras localidades desde la que se puede ir desde esta localidad { "dir": "d180", // identificador del sur (grados desde el norte) "target": "loc_urbo", // identificador de la localidad destino "lookDir":"EL_duonvojo_AL_urbo" // opcional: indica el id del mensaje que se mostrará si se mira hacia esta dirección // si en, como veremos, se le asocia el método look_dir() al item, no se llegará a usar nunca este valor } ] }, 3- Items de objetos { "id": "obj_buterita_pano", // identificador del item "type": "obj", // indica que es de tipo localidad "loc": "pc.harry", // inidica la localidad inicial "att": { // atributos del objeto "pezo": {"state":"4"}, // valor inicial del atributo especificado "grando": {"state":"4"}, // valor inicial del atributo especificado "mangheblo": {"state":"70"} // valor inicial del atributo especificado } }, 4- Items de tipo NPC Similar a los tipo "obj", pero indica que es un Non-Player Character (PNJ en español) La única diferencia entre un obj y un npc es que sobre un npc se activan algunas acciones, como hablar-con. -------------------------------------------------------------------------------- Definición de los atributos: + id del atributo + properties: [] // propiedades del atributo - {id, default} // cada una de las propiedades (default puede ser "undefined") + restrictedTo: [] // tipos que lo pueden tener + asignedTo:[] // tipos que deben tener este atributo + enabledActions:[] // acciones que habilita como objeto 1 + enabledActions_O2:[] // acciones que habilita como objeto2 --------------------------------------------------------------------------------- Métodos implementados hasta ahora ACCIONES (verbos): id: nombre de la acción enabled (): devuelve cierto cuando se quiere que se muestre como una opción para el objeto actual (y objeto secundario, opcional) reaction(): reacción genérica al ejecutar la acción sobre el objeto actual (y objeto secundario, opcional) DIRECCIONES (conexiones entre localidades): id: nombre de la dirección ATRIBUTOS (adjetivos) id: nombre del atributo desc(): para indicar qué se muestra del objeto que tenga ese atributo. ITEMS (objetos, localidades y personajes) id: nombre del item desc(): descripción dinámica del item. firstDesc(): primera vez que se describe. turn() cuando el item hace algo en el turno del mundo. look_dir(dirIndex): aplicado a una localidad, muestra mensajes cuando se mira hacia esa dirección precondToGo(): aplicado a una localidad, para determinar cuando se permite ir en determinada dirección. Reacciones específicas, con el nombre de la acción que sea Ejemplos: caja.open() ejecutará la reacción específica de abrir sobre la caja, en vez de ejecutar el método genérico. flutist.talk(): para mostrar lo que dice el PJ, así como generar tablas de respuestas permitidas que decirle.